#pragma once

#include "quote_data.h"
#include <vector>
#include <thread>
#include <atomic>
#include <random>
#include <functional>

namespace yquote {

class MarketDataSimulator {
public:
    using DataCallback = std::function<void(const QuoteData&)>;
    
    MarketDataSimulator();
    ~MarketDataSimulator();
    
    // 启动模拟器
    void start();
    
    // 停止模拟器
    void stop();
    
    // 检查是否正在运行
    bool isRunning() const;
    
    // 设置数据回调函数
    void setDataCallback(DataCallback callback);
    
    // 添加要模拟的股票
    void addSymbol(const std::string& symbol, double initial_price);
    
    // 移除股票
    void removeSymbol(const std::string& symbol);
    
    // 设置更新间隔（毫秒）
    void setUpdateInterval(int interval_ms);
    
    // 设置价格波动范围（百分比）
    void setPriceVolatility(double volatility_percent);
    
private:
    struct SymbolData {
        std::string symbol;
        double base_price;
        double current_price;
        double open_price;
        double high_price;
        double low_price;
        long long volume;
        
        SymbolData(const std::string& sym, double price)
            : symbol(sym), base_price(price), current_price(price),
              open_price(price), high_price(price), low_price(price), volume(0) {}
    };
    
    std::atomic<bool> running_;
    std::thread simulator_thread_;
    
    std::vector<SymbolData> symbols_;
    DataCallback data_callback_;
    
    int update_interval_ms_;
    double volatility_percent_;
    
    std::random_device rd_;
    std::mt19937 gen_;
    std::uniform_real_distribution<double> price_dist_;
    std::uniform_int_distribution<long long> volume_dist_;
    
    // 模拟器主循环
    void simulatorLoop();
    
    // 生成下一个价格
    double generateNextPrice(SymbolData& symbol_data);
    
    // 生成成交量
    long long generateVolume();
    
    // 初始化默认股票
    void initializeDefaultSymbols();
};

} // namespace yquote 